package mains;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import cartes.Carte;
import cartes.CouleurCarte;
import cartes.Denomination;
import java.util.Arrays;

public abstract class AbstractAnalyseurRang 
{	
    int i = 0;
    AbstractAnalyseurRang suiv;
    static List<AbstractAnalyseurRang> rangs =
            Arrays.asList(new Paire(), new Brelan(), new Quinte(), new Couleur(),
            new MainPleine(), new Carre(), new QuinteCouleur(), new Quintuplet(), 
            new QuinteRoyale());
    
    public AbstractAnalyseurRang getSuivant() 
    { 
        if(suiv == null) 
        {
            try {
            return rangs.get(i++); }
            catch(IndexOutOfBoundsException ioobe)
            {
                return null;
            }
            
        }
        AbstractAnalyseurRang s = suiv;
        suiv = null;
        return s;
    }
	
    public abstract boolean reconnaitreMain(ReqAnalyseMain ram);
	
    public void setSuivant(AbstractAnalyseurRang p) { suiv = p; }

    public static RangPoker traiterDemande(Main m) 
    {
        ReqAnalyseMain ram = new ReqAnalyseMain(m);
        RangPoker result = new RangPoker();
        int i = 0,j = 0;
        for (AbstractAnalyseurRang rang : rangs)
        {
            i++;
            if(rang.reconnaitreMain(ram))
            {
                j=i;
            }
        }
        result.score = j;
        
        Iterator<Carte> it = m.iterator();
        Carte c = it.next();
        Denomination topCarte = c.getDenomination();
        while(it.hasNext())
        {
            if(topCarte.compareTo(c.getDenomination()) < 0) topCarte = c.getDenomination();
            c = it.next();
        }
        result.topCarte = topCarte;
        
        return result;
    }
    
    protected boolean estMemeCouleur(Main m){
        Iterator<Carte> it = m.iterator();
        Carte c = it.next();
        CouleurCarte cc = c.getCouleur();
        it = m.iterator();
        while(it.hasNext())
        {
        	c = it.next();
            if(!c.getCouleur().equals(cc))
            	return false;
        }
        return true;
    }
    
    protected boolean estEnSerie(Main m){
    	Collections.sort((List<Carte>) m.getCartes());
    	Iterator<Carte> it = m.iterator();
    	Carte c = it.next();
    	Denomination d = c.getDenomination();
        while(it.hasNext())
        {
            c = it.next();
            if(c.getDenomination().compareTo(d) == 1)
            {
                d = c.getDenomination();
            }else{
            	return false;
            }
        }
    	return true;
    }
    
    protected Hashtable<Denomination,ArrayList<Carte>> regrouperMain(Main m) {
		Hashtable<Denomination, ArrayList<Carte>> groupes = new Hashtable<Denomination, ArrayList<Carte>>();

        Iterator<Carte> it = m.iterator();
        while(it.hasNext())
        {
        	Carte c = it.next();
        	if(groupes.containsKey(c.getDenomination())){
        		groupes.get(c.getDenomination()).add(c);
        	}else{
        		ArrayList<Carte> groupe = new ArrayList<Carte>();
        		groupe.add(c);
        		groupes.put(c.getDenomination(), groupe);
        	}
        }
        
        return groupes;
	}
}
